/**
 * jQuery Masonry v2.1.07
 * A dynamic layout plugin for jQuery
 * The flip-side of CSS Floats
 * http://masonry.desandro.com
 *
 * Licensed under the MIT license.
 * Copyright 2012 David DeSandro
 */
(function (a, b, c) {
    "use strict";
    var d = b.event, e = b.event.handle ? "handle" : "dispatch", f;
    d.special.smartresize = {setup: function () {
        b(this).bind("resize", d.special.smartresize.handler)
    }, teardown: function () {
        b(this).unbind("resize", d.special.smartresize.handler)
    }, handler: function (a, b) {
        var c = this, g = arguments;
        a.type = "smartresize", f && clearTimeout(f), f = setTimeout(function () {
            d[e].apply(c, g)
        }, b === "execAsap" ? 0 : 100)
    }}, b.fn.smartresize = function (a) {
        return a ? this.bind("smartresize", a) : this.trigger("smartresize", ["execAsap"])
    }, b.Mason = function (a, c) {
        this.element = b(c), this._create(a), this._init()
    }, b.Mason.settings = {isResizable: !0, isAnimated: !1, animationOptions: {queue: !1, duration: 500}, gutterWidth: 0, isRTL: !1, isFitWidth: !1, containerStyle: {position: "relative"}}, b.Mason.prototype = {_filterFindBricks: function (a) {
        var b = this.options.itemSelector;
        return b ? a.filter(b).add(a.find(b)) : a
    }, _getBricks: function (a) {
        //var b = this._filterFindBricks(a).css({position: "absolute"}).addClass("masonry-brick");
        var b = this._filterFindBricks(a).addClass("masonry-brick");
        return b
    }, _create: function (c) {
        this.options = b.extend(!0, {}, b.Mason.settings, c), this.styleQueue = [];
        var d = this.element[0].style;
        this.originalStyle = {height: d.height || ""};
        var e = this.options.containerStyle;
        for (var f in e)this.originalStyle[f] = d[f] || "";
       // this.element.css(e), this.horizontalDirection = this.options.isRTL ? "right" : "left";
        var g = this.element.css("padding-" + this.horizontalDirection), h = this.element.css("padding-top");
        this.offset = {x: g ? parseInt(g, 10) : 0, y: h ? parseInt(h, 10) : 0}, this.isFluid = this.options.columnWidth && typeof this.options.columnWidth == "function";
        var i = this;
        setTimeout(function () {
            i.element.addClass("masonry")
        }, 0), this.options.isResizable && b(a).bind("smartresize.masonry", function () {
            i.resize()
        }), this.reloadItems()
    }, _init: function (a) {
        this._getColumns(), this._reLayout(a)
    }, option: function (a, c) {
        b.isPlainObject(a) && (this.options = b.extend(!0, this.options, a))
    }, layout: function (a, b) {
        for (var c = 0, d = a.length; c < d; c++)this._placeBrick(a[c]);
        var e = {};
        e.height = Math.max.apply(Math, this.colYs);
        if (this.options.isFitWidth) {
            var f = 0;
            c = this.cols;
            while (--c) {
                if (this.colYs[c] !== 0)break;
                f++
            }
            e.width = (this.cols - f) * this.columnWidth - this.options.gutterWidth
        }
        this.styleQueue.push({$el: this.element, style: e});
        var g = this.isLaidOut ? this.options.isAnimated ? "animate" : "css" : "css", h = this.options.animationOptions, i;
        for (c = 0, d = this.styleQueue.length; c < d; c++)i = this.styleQueue[c], i.$el[g](i.style, h);
        this.styleQueue = [], b && b.call(a), this.isLaidOut = !0
    }, _getColumns: function () {
        var a = this.options.isFitWidth ? this.element.parent() : this.element, b = a.width();
        this.columnWidth = this.isFluid ? this.options.columnWidth(b) : this.options.columnWidth || this.$bricks.outerWidth(!0) || b, this.columnWidth += this.options.gutterWidth, this.cols = Math.floor((b + this.options.gutterWidth) / this.columnWidth), this.cols = Math.max(this.cols, 1)
    }, _placeBrick: function (a) {
        var c = b(a), d, e, f, g, h;
        d = Math.ceil(c.outerWidth(!0) / this.columnWidth), d = Math.min(d, this.cols);
        if (d === 1)f = this.colYs; else {
            e = this.cols + 1 - d, f = [];
            for (h = 0; h < e; h++)g = this.colYs.slice(h, h + d), f[h] = Math.max.apply(Math, g)
        }
        var i = Math.min.apply(Math, f), j = 0;
        for (var k = 0, l = f.length; k < l; k++)if (f[k] === i) {
            j = k;
            break
        }
        var m = {top: i + this.offset.y};
        m[this.horizontalDirection] = this.columnWidth * j + this.offset.x, this.styleQueue.push({$el: c, style: m});
        var n = i + c.outerHeight(!0), o = this.cols + 1 - l;
        for (k = 0; k < o; k++)this.colYs[j + k] = n
    }, resize: function () {
        var a = this.cols;
        this._getColumns(), (this.isFluid || this.cols !== a) && this._reLayout()
    }, _reLayout: function (a) {
        var b = this.cols;
        this.colYs = [];
        while (b--)this.colYs.push(0);
        this.layout(this.$bricks, a)
    }, reloadItems: function () {
        this.$bricks = this._getBricks(this.element.children())
    }, reload: function (a) {
        this.reloadItems(), this._init(a)
    }, appended: function (a, b, c) {
        if (b) {
            //this._filterFindBricks(a).css({top: this.element.height()});
            var d = this;
            setTimeout(function () {
                d._appended(a, c)
            }, 1)
        } else this._appended(a, c)
    }, _appended: function (a, b) {
        var c = this._getBricks(a);
        this.$bricks = this.$bricks.add(c), this.layout(c, b)
    }, remove: function (a) {
        this.$bricks = this.$bricks.not(a), a.remove()
    }, destroy: function () {
        this.$bricks.removeClass("masonry-brick").each(function () {
            this.style.position = "", this.style.top = "", this.style.left = ""
        });
        var c = this.element[0].style;
        for (var d in this.originalStyle)c[d] = this.originalStyle[d];
        this.element.unbind(".masonry").removeClass("masonry").removeData("masonry"), b(a).unbind(".masonry")
    }}, b.fn.imagesLoaded = function (a) {
        function h() {
            a.call(c, d)
        }

        function i(a) {
            var c = a.target;
            c.src !== f && b.inArray(c, g) === -1 && (g.push(c), --e <= 0 && (setTimeout(h), d.unbind(".imagesLoaded", i)))
        }

        var c = this, d = c.find("img").add(c.filter("img")), e = d.length, f = "", g = [];
        return e || h(), d.bind("load.imagesLoaded error.imagesLoaded", i).each(function () {
            var a = this.src;
            this.src = f, this.src = a
        }), c
    };
    var g = function (b) {
        a.console && a.console.error(b)
    };
    b.fn.masonry = function (a) {
        if (typeof a == "string") {
            var c = Array.prototype.slice.call(arguments, 1);
            this.each(function () {
                var d = b.data(this, "masonry");
                if (!d) {
                    g("cannot call methods on masonry prior to initialization; attempted to call method '" + a + "'");
                    return
                }
                if (!b.isFunction(d[a]) || a.charAt(0) === "_") {
                    g("no such method '" + a + "' for masonry instance");
                    return
                }
                d[a].apply(d, c)
            })
        } else this.each(function () {
            var c = b.data(this, "masonry");
            c ? (c.option(a || {}), c._init()) : b.data(this, "masonry", new b.Mason(a, this))
        });
        return this
    }
})(window, jQuery);